4 - Generisches Sortieren [ID:16201]
50 von 61 angezeigt

Als nächstes wollen wir euch vorstellen, wie ihr generisch sortieren könnt.

Generisch sortieren bedeutet in dem Fall, dass ihr beliebige Daten gleicher Größe in

einem Array sortieren könnt.

Und dies könnt ihr mit der Funktion qsort machen.

Das besondere an der Stelle ist, dass qsort nicht weiß, was es sortiert.

Das heißt, es kennt nicht die Strukturen der Daten, die in dem Array liegen, das ihr sortiert

haben wollt.

Damit es nun aber entscheiden kann, ob ein bestimmtes Element in dem Array größer ist

als ein anderes, braucht es eine Vergleichsfunktion, die vom Aufrufer bereitgestellt werden muss.

Dieses Programmierschema nennt man Rückruf bzw. im Englischen auch Callback genannt.

Die Funktion qsort könnt ihr aus der Datei stdlib.h inkludieren.

Und die Signatur sieht so aus, dass man als erstes Argument ein Array übergibt, gefolgt

von einmal der Anzahl der Elemente in diesem Array plus der Größe eines einzelnen Elementes.

Das letzte Argument an qsort ist die eben angesprochene Rückruffunktion, die zum Vergleichen

der einzelnen Elemente herangezogen werden kann.

Auf diese Funktion werden wir gleich noch genauer eingehen.

Die Vergleichsfunktion hat als Rückgabewert ein Integer.

Damit kann angezeigt werden, ob zwei Elemente, die gerade betrachtet werden, entweder gleich

sind, in dem Fall wird 0 zurückgegeben, oder ob die beiden betrachteten Argumente unterschiedlich

sind.

Für den Fall, dass das erste Argument kleiner ist als das zweite, wird ein Wert kleiner

0 zurückgegeben und andernfalls ein Wert großer 0.

An diesem Beispiel können wir sehen, dass wir ein Array von Integern haben, das sieben

Elemente fasst.

Dabei ist das Array gefüllt mit den Werten 0 bis 6, wobei die Sortierung nicht ganz stimmt.

Die Breite eines Elementes ist die Größe eines Integers.

Das wäre im Fall von x8664 zum Beispiel 4 byte.

Nun wird die qsort-Funktion nach einem bestimmten Algorithmus hergehen und die einzelnen Elemente

innerhalb des Arrays vergleichen und umsortieren.

In diesem Fall ruft die qsort-Funktion die compare-Funktion für die Elemente an der

Stelle 3 und 4 auf und merkt, dass das erste Argument größer ist als das zweite.

Da dies der Sortierreihenfolge widerspricht, kann qsort nun die beiden Elemente umtauschen

und damit die Sortierreihenfolge wieder herstellen.

Wenn wir jetzt noch ein bisschen näher auf die Vergleichsfunktion eingehen, dann können

wir uns den Typ der Argumente anschauen.

Die Vergleichsfunktion erhält als Argument Zeiger auf Feldelemente.

Das sind Zeiger in das Array, das der qsort-Funktion als erstes Argument übergeben wird.

Hier fällt auf, dass kein konkreter Typ mit angegeben wird.

Das bedeutet, dass an die compare-Funktion prinzipiell ein Pointer auf Beliebiges übergeben

werden kann und dass die compare-Funktion nun selbst einen Cast auf den entsprechenden

Typ tätigen kann.

Der Zusatz const bedeutet an dieser Stelle, dass die compare-Funktion den Inhalt der Daten,

auf die gezeigt wird, nicht manipuliert.

Das bedeutet, sie greift nur lesend darauf zu.

Wenn wir eine Funktion schreiben wollen, die im vorherigen Beispiel genutzt werden kann,

um Integer-Werte in einem Array zu sortieren, kann dies in etwa so aussehen.

Wir schreiben eine Funktion, die einen Integer als Rückgabewert hat und zwei konstante Void-Pointer

als Argument erwartet.

Einmal den Pointer a, einmal den Pointer b.

Damit wir sinnvoll mit den Werten, die von a und b referenziert werden, arbeiten können,

Teil einer Videoserie :
Teil eines Kapitels:
Sortieren und Fehlerbehandlung

Zugänglich über

Offener Zugang

Dauer

00:04:29 Min

Aufnahmedatum

2020-05-19

Hochgeladen am

2020-05-19 19:36:28

Sprache

de-DE

Einbetten
Wordpress FAU Plugin
iFrame
Teilen